/**
 * \file driver.c
 * \author Davide Gessa
 * \note Gestore dei driver per hardware e altre features
 * \date 10-12-09
 */
#include <driver.h>
#include <mm.h>
#include <debug.h>


/**
 * Inizializza il gestore dei driver
 */
void driver_init()
{
	DEBUGP("driver_init()\n");
	
	driver_list = NULL;
}



/**
 * Aggiune un driver alla lista
 * 
 * \param driver puntatore al driver da aggiungere alla lista
 * \return stato dell'operazione
 */
uint32_t driver_add(driver_t *driver)
{
	driver->next = driver_list;
	driver_list = driver;
	
	return DRV_OK;
}



/**
 * Elimina un driver
 * 
 * \param n nome del driver da eliminare
 * \return stato dell'eliminazione
 */
uint32_t driver_del(char *n)
{
	driver_t *m = driver_get(n);
	driver_t *pr = driver_list;
		
	if(m == NULL) return DRV_NF_ER;
	
	
	// Cerca il precedente
	if(m == driver_list)
	{
		driver_list = NULL;
	}
	else
	{
		while(pr != NULL && pr->next != NULL)
		{
			if(strcmp(pr->next->name, n) == 0) break; 
			pr = pr->next;
		}
		pr->next = m->next;
	}	
}


/**
 * Restituisce il nome del driver dato il num
 * 
 * \param x e' il numero del driver nella lista
 * \return nome del driver nella posizione x
 */
char *driver_get_x(uint32_t x)
{
	int i = 0;
	driver_t *m = driver_list;
	
	while(m != NULL)
	{
		if(i == x) return m->name;
		
		m = m->next;
		i++;
	}	
}


/**
 * Restituisce il driver dato il nome
 * 
 * \param name nome del driver da prelevare
 * \return il driver richiesto se e' presente, altrimenti NULL
 */
driver_t *driver_get(char *name)
{
	driver_t *m = driver_list;
	
	while(m != NULL)
	{
		if(strcmp(m->name, name) == 0)
			return m;
			
		m = m->next;	
	}
	return NULL;	
}
